commonlibsse_ng\re\i/
ItemList.rs

1use crate::re::BSTArray::BSTArray;
2use crate::re::GFxMovieView;
3use crate::re::GFxValue::{GFxValue, Value};
4use crate::re::GPtr::GPtr;
5use crate::re::PlayerCharacter::PlayerCharacter;
6use crate::re::StandardItemData::StandardItemData;
7use crate::re::TESObjectREFR::TESObjectREFR;
8
9#[repr(C)]
10#[derive(Debug)]
11pub struct Item {
12    pub data: StandardItemData, // 0x00
13    pub obj: GFxValue,          // 0x18 - kObject
14    pub unk30: u64,             // 0x30
15    pub unk38: u64,             // 0x38
16}
17const _: () = assert!(core::mem::size_of::<Item>() == 0x40);
18
19#[repr(C)]
20#[derive(Debug)]
21pub struct ItemList {
22    // - offset: 0x00
23    pub view: GPtr<GFxMovieView>,
24    // - offset: 0x08 - kDisplayObject - "_level0.Menu_mc.inventoryLists.panelContainer.itemList"
25    pub root: GFxValue,
26    // - offset: 0x20 - kArray - root.GetMember("entryList", &entryList);
27    pub entryList: GFxValue,
28    // - offset: 0x38
29    pub items: BSTArray<*mut Item>,
30    // - offset: 0x50
31    pub unk50: bool,
32    // - offset: 0x51
33    pub pad51: u8,
34    // - offset: 0x52
35    pub pad52: u16,
36    // - offset: 0x54
37    pub pad54: u32,
38}
39const _: () = assert!(core::mem::size_of::<ItemList>() == 0x58);
40
41impl ItemList {
42    pub fn get_selected_item(&self) -> Option<*mut Item> {
43        if self.unk50 {
44            return None;
45        }
46
47        let selected_index = self.root.get_member(c"selectedIndex")?;
48        let Value::Number(index) = selected_index.get_value()? else {
49            return None;
50        };
51
52        if (0.0..(self.items.len() as f64)).contains(&index) {
53            Some(self.items[index as usize])
54        } else {
55            None
56        }
57    }
58
59    pub fn update(&self) {
60        if let Some(player_character) = unsafe { PlayerCharacter::get_singleton_mut() } {
61            // Safety: `PlayerCharacter` is inherited `TESObjectREFR`
62            self.update_impl((player_character as *mut PlayerCharacter).cast());
63        }
64    }
65
66    #[commonlibsse_ng_derive_internal::relocate_fn(se_id = 50099, ae_id = 51031)]
67    pub fn update_impl(&self, owner: *mut TESObjectREFR) {}
68}